﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using EmpleadosSOAPServices.Persistencia;
using EmpleadosSOAPServices.Dominio;
using EmpleadosSOAPServices.Exceptions;

namespace EmpleadosSOAPServices
{
    public class Empleados : IEmpleados
    {

        private EmpleadoDAO empleadoDAO = null;
        private EmpleadoDAO EmpleadoDAO
        {
            get
            {
                if (empleadoDAO == null)
                    empleadoDAO = new EmpleadoDAO();
                return empleadoDAO;
            }
        }

        public Empleado CrearEmpleado(Empleado empleadoACrear)
        {
            Empleado empleado_dni = new Empleado();
            empleado_dni = EmpleadoDAO.ObtenerPorDNI(empleadoACrear);

            EmpleadoException ex = new EmpleadoException();

            if (empleado_dni != null)
            {
                ex.Message = "El DNI " + empleado_dni.NroDocumento + " ya existe se encuentra registrado para el empleado " + empleado_dni.Nombres;
                throw new FaultException<EmpleadoException>(ex, ex.Message);
            }


            int EdadValida = EmpleadoDAO.ObtenerEdad(empleadoACrear.FechaNacimiento);

            if (EdadValida < 18)
            {
                
                ex.Message = "El empleado que está intentando registrar es menor de edad";
                throw new FaultException<EmpleadoException>(ex, ex.Message);
            }


            return EmpleadoDAO.Crear(empleadoACrear);
        }

        public Empleado ObtenerEmpleado(int codigo)
        {
            return EmpleadoDAO.Obtener(codigo);
        }

        public Empleado ModificarEmpleado(Empleado empleadoAModificar)
        {
            Empleado empleado_dni = new Empleado();
            empleado_dni = EmpleadoDAO.ObtenerPorDNI(empleadoAModificar);

            EmpleadoException ex = new EmpleadoException();

            if (empleado_dni != null)
            {
                ex.Message = "El DNI " + empleado_dni.NroDocumento + " ya existe se encuentra registrado para el empleado " + empleado_dni.Nombres;
                throw new FaultException<EmpleadoException>(ex, ex.Message);
            }

            int EdadValida = EmpleadoDAO.ObtenerEdad(empleadoAModificar.FechaNacimiento);

            if (EdadValida < 18)
            {

                ex.Message = "El empleado que está intentando registrar es menor de edad";
                throw new FaultException<EmpleadoException>(ex, ex.Message);
            }


            return EmpleadoDAO.Modificar(empleadoAModificar);


        }

        public void EliminarEmpleado(int codigo)
        {
            Empleado empleadoExistente = EmpleadoDAO.Obtener(codigo);
            EmpleadoDAO.Eliminar(empleadoExistente);
        }

        public List<Empleado> ListarEmpleados()
        {
            return EmpleadoDAO.ListarTodos().ToList();
        }

        public Empleado ObtenerEmpleadoDisponible(string cargo)
        {
            return EmpleadoDAO.ObtenerEmpleadoDisponible(cargo);
        }

        public Empleado ObtenerUnidadAsignaEmpleado(int IdUnidad)
        {
            return EmpleadoDAO.ObtenerUnidadAsignaEmpleado(IdUnidad);
        }


        public List<Empleado> ListarEmpleadosFiltros(Empleado empleadofiltro)
        {

            List<Empleado> empl = EmpleadoDAO.ListarEmpleadosFiltros(empleadofiltro);

            EmpleadoException ex = new EmpleadoException();

            if (empl == null)
            {
                ex.Message = "No existen datos para los criterios seleccionados";
                throw new FaultException<EmpleadoException>(ex, ex.Message);
            }

            return EmpleadoDAO.ListarEmpleadosFiltros(empleadofiltro);
        }
    }
}
